package org.graduation.recruitment.service.other;

import jakarta.annotation.PostConstruct;
import jakarta.mail.*;
import jakarta.mail.internet.InternetAddress;
import jakarta.mail.internet.MimeMessage;
import lombok.extern.slf4j.Slf4j;
import org.graduation.recruitment.entity.dto.PassAndInterviewNotificationDTO;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Properties;

/**
 * 面试通知类，用于发送面试通过的通知邮件。
 */
@Component
@Slf4j
public class InterviewNotification {
    @Value("${spring.mail.host}")
    private String host; // 邮件服务器主机
    @Value("${spring.mail.port}")
    private String port; // 邮件服务器端口
    @Value("${spring.mail.username}")
    private String account; // 发送邮件的账户
    @Value("${spring.mail.password}")
    private String password; // 发送邮件的账户密码
    private Properties props; // 邮件服务器属性
    private Session session; // 邮件会话
    private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 日期格式化

    /**
     * 初始化邮件配置，设置SMTP邮件服务器属性并创建邮件会话。
     */
    @PostConstruct
    public void init() {
        log.info("初始化邮件配置");
        log.debug("host:{},port:{}", host, port);
        log.debug("account:{},password:{}", account, password);
        props = new Properties();
        props.put("mail.smtp.auth", "true"); // 开启认证
        props.put("mail.smtp.starttls.enable", "true"); // 启用SSL/TLS加密
        props.put("mail.smtp.host", host); // SMTP服务器地址
        props.put("mail.smtp.port", port); // SMTP端口
        // 创建会话并进行身份验证
        session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(account, password);
            }
        });
    }

    /**
     * 发送面试通过通知邮件。
     *
     * @param dto 面试通知信息的数据传输对象，包含邮件内容的必要信息。
     * @throws RuntimeException 如果发送邮件过程中出现异常。
     */
    public void alarm(PassAndInterviewNotificationDTO dto) {
        try {
            // 创建消息对象
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(account)); // 发送者邮箱
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(dto.getStudentEmail())); // 接收者邮箱
            message.setSubject(dto.getEnterpriseName() + "企业面试邀请"); // 邮件主题
            // 设置邮件正文
            message.setText(generateContent(dto));
            // 发送邮件
            Transport.send(message);

        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 根据传入的DTO生成面试通知的内容。
     *
     * @param dto 包含面试通知所需全部信息的数据传输对象。包括：
     *            学生姓名、企业名称、岗位名称、面试时间、面试地点、企业联系人、联系电话、备注信息。
     * @return 格式化的面试通知内容，以HTML格式的字符串返回，包含面试者姓名、企业名称、岗位名称、
     * 面试时间、面试地点、企业联系人、联系电话以及备注信息。
     */
    public String generateContent(PassAndInterviewNotificationDTO dto) {
        // 使用String.format格式化字符串，生成面试通知的内容
        return String.format(
                "亲爱的%s同学：<br/>" +
                        "\t恭喜您通过%s企业的%s岗位简历筛选。请与%s到%s进行面试。<br/>" +
                        "\t企业联系人：%s，联系电话：%s<br/>" +
                        "\t备注%s",
                dto.getStudentName(),
                dto.getEnterpriseName(), dto.getJobName(), dateFormat.format(dto.getInterviewTime()), dto.getAddress(),
                dto.getContact(), dto.getPhone(),
                // 若备注信息为空，则显示“无”，否则显示备注信息
                dto.getRemark().isEmpty() ? "无" : dto.getRemark()
        );
    }

}